$('.fields-main, .fields-map').livequery(function() {
	$('.city-field').myAutocomplite(
			options = {
				requestUrl : 'city/auto-suggest',
				essenceId : 'ID_city',
				wrongString : 'Выберите город',
				onSelect : function(item) {
					if(mapObject.lastIdCity != item.ID_city) document.location = W_ABSPATH + 'fields/' + item.url;
				}
	});	
	
	$('.top-controls form').submit(function() {
		return false;
	});
});

var mapObject = {
		mapContainer : 'fields-map',
		currentPointPosition : [],				// Текущая точка позиционирования
		markersArray : [],				// Массив данных маркеров текущего города на карте
		markersCollection : {},					// Коллекция объектов маркеров текущго города на карте
		lastIdCity : null,						// Хранит id прошлого города показываемого на карте
		currentIdCity : null,					// Хранит id текущего показываемого на карте города
		zoom : 13,								// Значение зума при позиционировании на точке
		markerToAdd : null,						// Объект маркера при добавлении
		clickListener : null,					// Обрабочик клика при добавлении маркера
		allowDistance : 20,						// Максимально допустимое расстояние(км) от города карты при добавлении маркера
		lastPosition : '',						// Переменная используется при добавлении маркера для возврата на предыдущее положение при нарушении расстояния
		isSaving : false,
				
		init : function() {																
			this.currentPointPosition = $('#map-options').data('city-info');			
			this.markersArray = $('#map-options').attr('data-markers-info') == null ? null : $('#map-options').data('markers-info');		
			this.currentIdCity = $('#ID_city').val();							
			
			var self = this;
			var mapOptions = {
					zoom: self.zoom,
					center: [self.currentPointPosition.latitude, self.currentPointPosition.longitude],
					behaviors: ['scrollZoom','drag']
			};
			map = new ymaps.Map(self.mapContainer, mapOptions);
			map.controls.add('mapTools');
			
			self.markersCollection = new ymaps.GeoObjectCollection();
			map.geoObjects.add(self.markersCollection);
			
			if(self.markersArray && self.markersArray.length) self.positionOnMarkers();
			else map.setCenter([self.currentPointPosition.latitude, self.currentPointPosition.longitude], self.zoom, {checkZoomRange: true});
			
			// Даёт возможность ставить маркеры
			$("#push-marker").live('click', function(){
				$(this).hide();
				$(".saving-btns").show();
				self.acceptAddMarker();
				return false;
			});
			
			// Сохранение добавленного маркера
			$("#save-marker").live('click', function() {
				if(!self.markerToAdd) alert('Отметьте поле');
				else $('#field-params').dialog({draggable: false, resizable: false, title: 'Описание поля', height: 'auto', width: 270, modal: true, beforeClose: beforeClose});
				return false;
				
				function beforeClose () { 
					$("input[name='cost'], input[name='type']").removeAttr("checked");
					$('#field-params textarea').val('');
					$('#field-params .val-err').hide();
					self.cancelAdding(); }
			});
			
			$('.full-save').live('click', function() {
				$('#field-params .val-err').html('');
				var valFlag = true;
				if(!$("input[name='cost']:checked").val() || !$("input[name='type']:checked").val())  {
					$('#field-params .val-err').append('<div>Укажите тип поля и доступность<div>');
					valFlag = false;
					
				}
				if($('#field-params textarea').val() == '') {
					$('#field-params .val-err').append('<div>Заполните описание</div>');
					valFlag = false;
				}
				
				if(valFlag) self.AddMarker();
				else if(!$('#field-params .val-err').is(":visible")) {
					$('#field-params .val-err').clearQueue().slideDown();
					setTimeout(function() { $('#field-params .val-err').slideUp();}, 2500);
				}

				return false;
			});
			
			// Отмена добавления
			$("#cancel-saving").live('click', function() {
				self.cancelAdding();
				return false;
			});
		},
		
		cancelAdding : function() {
			var self = this;
			if(self.markerToAdd) {
				self.markersCollection.remove(self.markerToAdd);
				self.markerToAdd = null;
				$("#push-marker").unbind('click');
			}
			map.events.remove('click', self.addMarkerOnMap, self);
			$('.saving-btns').hide();
			$("#push-marker").show();
		},
		
		// Функция позиционирования карты на маркерах из объекта mapObject
		positionOnMarkers: function() {
			var self = this;
			for(var i = 0; i < self.markersArray.length; i++) {
				self.addMarkerInCollection(self.markersArray[i]);
			}
			map.geoObjects.add(self.markersCollection);
			map.setBounds(self.markersCollection.getBounds(), {checkZoomRange : true});
			self.lastIdCity = self.currentIdCity;
		},
		
		addMarkerInCollection: function(markerArray) {
			var self = this;
			var placemark = new ymaps.Placemark([markerArray.latitude, markerArray.longitude], {
				balloonContent: self.makeBalloonContent(markerArray.cost, markerArray.type, markerArray.description)
			});		
			self.markersCollection.add(placemark);
		},
		
		makeBalloonContent : function(cost, type, description) {
			return  '<div class="color-status ' + (cost == 1 ? 'fee">Платное' :  'free">Бесплатное') + '</div>' + 
					'<div class="type ' + (type == 1 ? 'out">Открытое' :  'in">Закрытое') + '</div>' +
					'<div class="desc">' + description  + '</div>'
		},
		
		acceptAddMarker : function() {
			map.events.add('click', this.addMarkerOnMap, this);
		},
		
		addMarkerOnMap : function(e) {
			var self = this;
			clickedCoordinates = e.get('coordPosition');
			if(!self.checkAllowDistance(clickedCoordinates)) alert('Слишком далеко от заданного города');
			else if(!self.markerToAdd) {
				self.lastPosition = clickedCoordinates;
	    		self.markerToAdd = new ymaps.Placemark(clickedCoordinates,{},{draggable : true});
	    		self.markersCollection.add(self.markerToAdd);
	    		// Обработчик на перетаскивание - если при перетаскивание маркер утащили слишком далеко, делаем alert  и возвращаем маркер туда, откуда взяли
	    		self.markerToAdd.events.add('dragend', 
	    										function() {
													if(!self.checkAllowDistance(self.markerToAdd.geometry.getCoordinates())) {
														alert('Слишком далеко от заданного города');
														self.markerToAdd.geometry.setCoordinates(self.lastPosition);
													}
													else self.lastPosition = self.markerToAdd.geometry.getCoordinates();
	    										},
	    										self
	    									);
	    	}
	    	else {
	    		self.markerToAdd.geometry.setCoordinates(clickedCoordinates);
	    		self.lastPosition = clickedCoordinates;
	    	}
		},
		
		// Проверяет допустимое ли рассстояние от заданных координат до координат города карты
		checkAllowDistance : function(coords) {
			var self = this;
			
			var distance =  6371 * Math.acos(Math.sin(self.currentPointPosition.latitude * Math.PI / 180) * Math.sin(coords[0] * Math.PI / 180) + Math.cos(self.currentPointPosition.latitude * Math.PI / 180) * Math.cos(coords[0] * Math.PI / 180) * Math.cos(self.currentPointPosition.longitude * Math.PI / 180 - coords[1] * Math.PI / 180));					
			if(distance > this.allowDistance) return false;
			else return true;
		},
		
		// Обнуляет коллекцию маркеров
		clearMarkersCollection : function() {
			if(this.markersCollection && this.markersCollection.getLength()) {
			this.markersCollection.removeAll();
			this.markersCollection = new ymaps.GeoObjectCollection();
			}
		},
		
		AddMarker : function() {
			var self = this;
			if(self.isSaving) return false;
			else {
				self.isSaving = true;
				self.markerToAdd.options.set({draggable : false});
				var markerPoint = self.markerToAdd.geometry.getCoordinates();
				var cost = $("input[name='cost']:checked").val();				
				var type = $("input[name='type']:checked").val();
				var description = $('#field-params textarea').val();
				$.ajax({
					dataType: 'json',
					url: W_AJAX + 'field/add-marker',
					type: 'POST',
					data: {
						ID_city: $("#ID_city").val(),
						latitude: markerPoint[0],
						longitude: markerPoint[1],
						cost: cost,
						type: type,
						description: description
					},
					success: function(data) {
						if(data.result != 'OK') self.markersCollection.remove(self.markerToAdd);
						if(data.result == 'OK') self.markerToAdd.properties.set("balloonContent",  self.makeBalloonContent(cost, type, description));
						map.events.remove('click', self.addMarkerOnMap, self);					
						self.markerToAdd = null;
						$(".saving-btns").hide();
						$("#push-marker").show();
						self.isSaving = false;
						$( "#field-params" ).dialog( "close" );
					}	
				});
			}
		}
	}